#include "dao.h"

List *admin_list = NULL;
List *user_list = NULL;
static size_t global_count = 0;
static size_t global_size = 0;
static FILE* global_fwp = NULL;

void print(const void* content) {
    fwrite(content, global_size, 1, global_fwp);
    global_count++;
}

// 编码（序列化）
void encode(const char* src_buf, char* dst_buf, int length) {
    printf("%p\r\n", src_buf);
    printf("%p\r\n", dst_buf);
    printf("%d\r\n", length);
}

// 解码（反序列化）
static bool decode(const char* path) {
    // 读取用户传入的文件
    FILE* target_file = fopen(path, "r");
    if (target_file == NULL)
        return false;

    FILE* tmp_file = fopen(TEMP_FILE, "w");
    if (tmp_file == NULL)
        return false;

    // 打开临时文件
    size_t len = strlen(SECRET), i = 0;
    uint8_t data = 0;

    while(fread(&data, 1, 1, target_file)) {
        data ^= SECRET[i++ % len];
        fwrite(&data, 1, 1, tmp_file);
    }

    fclose(target_file);
    fclose(tmp_file);

    target_file = NULL;
    tmp_file = NULL;

    // 将用户文件内容写入到临时文件中
    remove(path);
    rename(TEMP_FILE, path);

    // 移除用户文件
    // 将临时文件重命名为用户文件
    return true;
}

// load加载
// 根据path路径读文件，将读取到的文件加载到buffer缓冲区
size_t load(List* list, const char* path, int length) {
    decode(path);

    FILE* target_file = fopen(path, "r");
    if (target_file == NULL) {
        return 0;
    }

    size_t count = 0;
    while(true) {
        void* buffer = malloc(length);
        if (fread(buffer, length, 1, target_file) <= 0) {
            fclose(target_file);
            break;
        }
        // 这里只是把node里面的ptr所指向的内存区域加密，并没有把整个链表加密
        add_list_tail(list, buffer);
        count++;
        // sleep(1);
    }
    return count;
}

// save保存
// 根据path创建文件，将buffern内容保存到这个文件中
size_t save(List* list, const char* path, int length) {
    global_fwp = fopen(path, "w");
    global_count = 0;
    global_size = length;

    // 将列表的数据写入文件中
    show_list(list, print);
    fclose(global_fwp);
    global_fwp = NULL;
    decode(path);
    return global_count;
}
